package com.tennis.tennisreservation.repository;

import com.tennis.tennisreservation.entity.Coupon;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 红包数据访问接口
 */
@Repository
public interface CouponRepository extends JpaRepository<Coupon, Long> {
    
    /**
     * 根据用户ID查询红包列表
     * @param userId 用户ID
     * @return 红包列表
     */
    List<Coupon> findByUserId(Long userId);
    
    /**
     * 根据用户ID分页查询红包
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页红包数据
     */
    Page<Coupon> findByUserId(Long userId, Pageable pageable);
    
    /**
     * 根据状态查询红包
     * @param status 红包状态
     * @return 红包列表
     */
    List<Coupon> findByStatus(String status);
    
    /**
     * 根据用户ID和状态查询红包
     * @param userId 用户ID
     * @param status 红包状态
     * @return 红包列表
     */
    List<Coupon> findByUserIdAndStatus(Long userId, String status);
    
    /**
     * 查询用户有效期内的未使用红包
     * @param userId 用户ID
     * @param now 当前时间
     * @return 有效红包列表
     */
    @Query("SELECT c FROM Coupon c WHERE c.userId = :userId AND c.status = '未使用' " +
           "AND c.validFrom <= :now AND c.validTo >= :now")
    List<Coupon> findValidCoupons(@Param("userId") Long userId, @Param("now") LocalDateTime now);
    
    /**
     * 查询所有过期未使用的红包
     * @param now 当前时间
     * @return 过期红包列表
     */
    @Query("SELECT c FROM Coupon c WHERE c.status = '未使用' AND c.validTo < :now")
    List<Coupon> findExpiredCoupons(@Param("now") LocalDateTime now);
} 